package com.module.frame.base

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.UiThread

/**
 * @author yanxuwen
 * @date 2018/6/9 17:13
 * @desc 懒加载 Fragment 基类
 */
abstract class BaseLazyFragment : AppBaseFragment() {
    /**
     * 懒加载过
     */
    var isLazyLoaded = false

    /**
     * Fragment的View加载完毕的标记
     */
    private var isPrepared = false

    override fun onResume() {
        super.onResume()

        //ViewPage2在这里实现懒加载，如果是ViewPage则在onActivityCreated
        //另外这里调用一次lazyLoad(）
        isPrepared = true
        mRootView.post { lazyLoad() }
    }

    /**
     * 第二步
     * 此方法会在onCreateView(）之前执行
     * 当viewPager中fragment改变可见状态时也会调用
     * 当fragment 从可见到不见，或者从不可见切换到可见，都会调用此方法
     */
    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        visible()
        lazyLoad()
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return super.onCreateView(inflater, container, savedInstanceState)
    }

    private fun visible() {
        if (userVisibleHint && isLazyLoaded) {
            refreshLoad()
        }
    }

    /**
     * 调用懒加载
     * 第三步:在lazyLoad()方法中进行双重标记判断,通过后即可进行数据加载
     */
    private fun lazyLoad() {
        if (userVisibleHint && isPrepared && !isLazyLoaded) {
            onLazyLoad()
            isLazyLoaded = true
        }
    }

    fun refreshLoad() {}

    /**
     * 第四步:定义抽象方法onLazyLoad(),具体加载数据的工作,交给子类去完成
     */
    @UiThread
    abstract fun onLazyLoad()
}